#include <iostream>
#include <string>
#include <cmath>

using std::cout;
using std::endl;
using std::string;

// 定义一个点Point类，数据成员是横纵坐标（float）；
// 定义一个颜色类Color数据成员只有颜色（string）；
// 一个直线类Line，数据成员是两个Point对象，表示起点和终点（即Point两个对象为Line的内嵌对象）；
// 一个三角形类Triangle，继承自Line和Color，数据成员有三角形的高height（float），三角形理解成以基类Color为颜色，以基类直线为底，以height为高的直角三角形，(即直线和高分别为两条直角边)
// 请实现相关函数，计算三角形的颜色、周长和面积并给出相关输出

class Point
{
friend class Line;
public:
    Point(double x, double y);
private:
    double _x;
    double _y;
};

Point::Point(double x, double y)
    : _x(x)
    , _y(y){
}


class Color
{
public:
    Color(const string& color);
    Color(const Color& rhs);
protected:
    const string& getColor(void) const;
private:
    string _color;
};

Color::Color(const string& color)
    : _color(color){
}
Color::Color(const Color& rhs)
    : _color(rhs._color){
}

const string& Color::getColor(void) const{
    return _color;
}


class Line
{
public:
    Line(const Point& start, const Point& end);
    Line(const Line& rhs);
protected:
    double LineLenth(void);
private:
    Point _start;
    Point _end;
};

Line::Line(const Point& start, const Point& end)
    : _start(start)
    , _end(end){
}
Line::Line(const Line& rhs)
    : _start(rhs._start)
    , _end(rhs._end){
}

double Line::LineLenth(void){
    return sqrt(pow((_start._x - _end._x), 2) + pow((_start._y - _end._y), 2));
}




class Triangle
    : public Line
    , public Color
{
public:
    Triangle(const Line& line, const Color& Color, double height);
    double TriangleArea(void) ;
    double TrianglePerimeter(void);
    const string& TriangleColor(void) const;
private:
    double _height;
};

Triangle::Triangle(const Line& line, const Color& color, double height)
    : Line(line)
    , Color(color)
    , _height(height){

}

double Triangle::TriangleArea(void) {
    return LineLenth() * _height / 2;
}

double Triangle::TrianglePerimeter(void){
    return sqrt(pow(LineLenth(), 2) + pow(_height, 2)) + LineLenth() + _height;
}

const string& Triangle::TriangleColor(void) const{
    return getColor();
}

int main(void)
{
    Triangle T1({{0, 0}, {6, 0}}, {"red"}, {8});

    cout << T1.TriangleArea() << endl;
    cout << T1.TrianglePerimeter() << endl;
    cout << T1.TriangleColor() << endl;

    return 0;
}